{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: matgraphdb in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (0.0.3)\n", "Requirement already satisfied: pytest in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (8.3.4)\n", "Requirement already satisfied: setuptools in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (75.1.0)\n", "Requirement already satisfied: setuptools_scm in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (8.1.0)\n", "Requirement already satisfied: python-dotenv in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (1.0.1)\n", "Requirement already satisfied: numpy in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (1.26.4)\n", "Requirement already satisfied: pandas in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (2.2.3)\n", "Requirement already satisfied: scipy in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (1.13.1)\n", "Requirement already satisfied: matplotlib in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (3.9.4)\n", "Requirement already satisfied: seaborn in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (0.13.2)\n", "Requirement already satisfied: pyyaml in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (6.0.2)\n", "Requirement already satisfied: jupyterlab in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (4.3.3)\n", "Requirement already satisfied: nglview in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (3.1.4)\n", "Requirement already satisfied: ipywidgets in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (8.1.5)\n", "Requirement already satisfied: pylint in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (3.3.2)\n", "Requirement already satisfied: autopep8 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (2.3.1)\n", "Requirement already satisfied: pymatgen in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (2024.8.9)\n", "Requirement already satisfied: parquetdb in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (0.23.4)\n", "Requirement already satisfied: variconfig in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matgraphdb) (0.0.3)\n", "Requirement already satisfied: pycodestyle>=2.12.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from autopep8->matgraphdb) (2.12.1)\n", "Requirement already satisfied: tomli in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from autopep8->matgraphdb) (2.2.1)\n", "Requirement already satisfied: comm>=0.1.3 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipywidgets->matgraphdb) (0.2.2)\n", "Requirement already satisfied: ipython>=6.1.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipywidgets->matgraphdb) (8.18.1)\n", "Requirement already satisfied: traitlets>=4.3.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipywidgets->matgraphdb) (5.14.3)\n", "Requirement already satisfied: widgetsnbextension~=4.0.12 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipywidgets->matgraphdb) (4.0.13)\n", "Requirement already satisfied: jupyterlab-widgets~=3.0.12 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipywidgets->matgraphdb) (3.0.13)\n", "Requirement already satisfied: async-lru>=1.0.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyterlab->matgraphdb) (2.0.4)\n", "Requirement already satisfied: httpx>=0.25.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyterlab->matgraphdb) (0.28.1)\n", "Requirement already satisfied: importlib-metadata>=4.8.3 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyterlab->matgraphdb) (8.5.0)\n", "Requirement already satisfied: ipykernel>=6.5.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyterlab->matgraphdb) (6.29.5)\n", "Requirement already satisfied: jinja2>=3.0.3 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyterlab->matgraphdb) (3.1.4)\n", "Requirement already satisfied: jupyter-core in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyterlab->matgraphdb) (5.7.2)\n", "Requirement already satisfied: jupyter-lsp>=2.0.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyterlab->matgraphdb) (2.2.5)\n", "Requirement already satisfied: jupyter-server<3,>=2.4.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyterlab->matgraphdb) (2.14.2)\n", "Requirement already satisfied: jupyterlab-server<3,>=2.27.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyterlab->matgraphdb) (2.27.3)\n", "Requirement already satisfied: notebook-shim>=0.2 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyterlab->matgraphdb) (0.2.4)\n", "Requirement already satisfied: packaging in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyterlab->matgraphdb) (24.2)\n", "Requirement already satisfied: tornado>=6.2.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyterlab->matgraphdb) (6.4.2)\n", "Requirement already satisfied: contourpy>=1.0.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matplotlib->matgraphdb) (1.3.0)\n", "Requirement already satisfied: cycler>=0.10 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matplotlib->matgraphdb) (0.12.1)\n", "Requirement already satisfied: fonttools>=4.22.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matplotlib->matgraphdb) (4.55.3)\n", "Requirement already satisfied: kiwisolver>=1.3.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matplotlib->matgraphdb) (1.4.7)\n", "Requirement already satisfied: pillow>=8 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matplotlib->matgraphdb) (11.0.0)\n", "Requirement already satisfied: pyparsing>=2.3.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matplotlib->matgraphdb) (3.2.0)\n", "Requirement already satisfied: python-dateutil>=2.7 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matplotlib->matgraphdb) (2.9.0.post0)\n", "Requirement already satisfied: importlib-resources>=3.2.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from matplotlib->matgraphdb) (6.4.5)\n", "Requirement already satisfied: notebook>=7 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from nglview->matgraphdb) (7.3.1)\n", "Requirement already satisfied: pytz>=2020.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pandas->matgraphdb) (2024.2)\n", "Requirement already satisfied: tzdata>=2022.7 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pandas->matgraphdb) (2024.2)\n", "Requirement already satisfied: pyarrow in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from parquetdb->matgraphdb) (18.1.0)\n", "Requirement already satisfied: beautifulsoup4 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from parquetdb->matgraphdb) (4.12.3)\n", "Requirement already satisfied: requests in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from parquetdb->matgraphdb) (2.32.3)\n", "Requirement already satisfied: dill in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from parquetdb->matgraphdb) (0.3.9)\n", "Requirement already satisfied: pathos in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from parquetdb->matgraphdb) (0.3.3)\n", "Requirement already satisfied: dask in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from parquetdb->matgraphdb) (2024.8.0)\n", "Requirement already satisfied: distributed in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from parquetdb->matgraphdb) (2024.8.0)\n", "Requirement already satisfied: platformdirs>=2.2.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pylint->matgraphdb) (4.3.6)\n", "Requirement already satisfied: astroid<=3.4.0-dev0,>=3.3.5 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pylint->matgraphdb) (3.3.6)\n", "Requirement already satisfied: isort!=5.13.0,<6,>=4.2.5 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pylint->matgraphdb) (5.13.2)\n", "Requirement already satisfied: mccabe<0.8,>=0.6 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pylint->matgraphdb) (0.7.0)\n", "Requirement already satisfied: tomlkit>=0.10.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pylint->matgraphdb) (0.13.2)\n", "Requirement already satisfied: colorama>=0.4.5 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pylint->matgraphdb) (0.4.6)\n", "Requirement already satisfied: typing-extensions>=3.10.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pylint->matgraphdb) (4.12.2)\n", "Requirement already satisfied: joblib>=1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pymatgen->matgraphdb) (1.4.2)\n", "Requirement already satisfied: monty>=2024.7.29 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pymatgen->matgraphdb) (2024.10.21)\n", "Requirement already satisfied: networkx>=2.2 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pymatgen->matgraphdb) (3.2.1)\n", "Requirement already satisfied: palettable>=3.3.3 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pymatgen->matgraphdb) (3.3.3)\n", "Requirement already satisfied: plotly>=4.5.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pymatgen->matgraphdb) (5.24.1)\n", "Requirement already satisfied: pybtex>=0.24.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pymatgen->matgraphdb) (0.24.0)\n", "Requirement already satisfied: ruamel.yaml>=0.17.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pymatgen->matgraphdb) (0.18.6)\n", "Requirement already satisfied: spglib>=2.5.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pymatgen->matgraphdb) (2.5.0)\n", "Requirement already satisfied: sympy>=1.2 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pymatgen->matgraphdb) (1.13.2)\n", "Requirement already satisfied: tabulate>=0.9 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pymatgen->matgraphdb) (0.9.0)\n", "Requirement already satisfied: tqdm>=4.60 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pymatgen->matgraphdb) (4.67.1)\n", "Requirement already satisfied: uncertainties>=3.1.4 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pymatgen->matgraphdb) (3.2.2)\n", "Requirement already satisfied: exceptiongroup>=1.0.0rc8 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pytest->matgraphdb) (1.2.2)\n", "Requirement already satisfied: iniconfig in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pytest->matgraphdb) (2.0.0)\n", "Requirement already satisfied: pluggy<2,>=1.5 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pytest->matgraphdb) (1.5.0)\n", "Requirement already satisfied: toml in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from variconfig->matgraphdb) (0.10.2)\n", "Requirement already satisfied: anyio in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from httpx>=0.25.0->jupyterlab->matgraphdb) (4.7.0)\n", "Requirement already satisfied: certifi in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from httpx>=0.25.0->jupyterlab->matgraphdb) (2024.8.30)\n", "Requirement already satisfied: httpcore==1.* in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from httpx>=0.25.0->jupyterlab->matgraphdb) (1.0.7)\n", "Requirement already satisfied: idna in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from httpx>=0.25.0->jupyterlab->matgraphdb) (3.7)\n", "Requirement already satisfied: h11<0.15,>=0.13 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from httpcore==1.*->httpx>=0.25.0->jupyterlab->matgraphdb) (0.14.0)\n", "Requirement already satisfied: zipp>=3.20 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from importlib-metadata>=4.8.3->jupyterlab->matgraphdb) (3.21.0)\n", "Requirement already satisfied: debugpy>=1.6.5 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel>=6.5.0->jupyterlab->matgraphdb) (1.8.11)\n", "Requirement already satisfied: jupyter-client>=6.1.12 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel>=6.5.0->jupyterlab->matgraphdb) (8.6.3)\n", "Requirement already satisfied: matplotlib-inline>=0.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel>=6.5.0->jupyterlab->matgraphdb) (0.1.7)\n", "Requirement already satisfied: nest-asyncio in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel>=6.5.0->jupyterlab->matgraphdb) (1.6.0)\n", "Requirement already satisfied: psutil in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel>=6.5.0->jupyterlab->matgraphdb) (6.1.0)\n", "Requirement already satisfied: pyzmq>=24 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel>=6.5.0->jupyterlab->matgraphdb) (26.2.0)\n", "Requirement already satisfied: decorator in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipython>=6.1.0->ipywidgets->matgraphdb) (5.1.1)\n", "Requirement already satisfied: jedi>=0.16 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipython>=6.1.0->ipywidgets->matgraphdb) (0.19.2)\n", "Requirement already satisfied: prompt-toolkit<3.1.0,>=3.0.41 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipython>=6.1.0->ipywidgets->matgraphdb) (3.0.48)\n", "Requirement already satisfied: pygments>=2.4.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipython>=6.1.0->ipywidgets->matgraphdb) (2.18.0)\n", "Requirement already satisfied: stack-data in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipython>=6.1.0->ipywidgets->matgraphdb) (0.6.3)\n", "Requirement already satisfied: MarkupSafe>=2.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jinja2>=3.0.3->jupyterlab->matgraphdb) (2.1.3)\n", "Requirement already satisfied: pywin32>=300 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-core->jupyterlab->matgraphdb) (308)\n", "Requirement already satisfied: argon2-cffi>=21.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (23.1.0)\n", "Requirement already satisfied: jupyter-events>=0.9.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (0.10.0)\n", "Requirement already satisfied: jupyter-server-terminals>=0.4.4 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (0.5.3)\n", "Requirement already satisfied: nbconvert>=6.4.4 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (7.16.4)\n", "Requirement already satisfied: nbformat>=5.3.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (5.10.4)\n", "Requirement already satisfied: overrides>=5.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (7.7.0)\n", "Requirement already satisfied: prometheus-client>=0.9 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (0.21.1)\n", "Requirement already satisfied: pywinpty>=2.0.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (2.0.14)\n", "Requirement already satisfied: send2trash>=1.8.2 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (1.8.3)\n", "Requirement already satisfied: terminado>=0.8.3 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (0.18.1)\n", "Requirement already satisfied: websocket-client>=1.7 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (1.8.0)\n", "Requirement already satisfied: babel>=2.10 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyterlab-server<3,>=2.27.1->jupyterlab->matgraphdb) (2.16.0)\n", "Requirement already satisfied: json5>=0.9.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyterlab-server<3,>=2.27.1->jupyterlab->matgraphdb) (0.10.0)\n", "Requirement already satisfied: jsonschema>=4.18.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyterlab-server<3,>=2.27.1->jupyterlab->matgraphdb) (4.23.0)\n", "Requirement already satisfied: tenacity>=6.2.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from plotly>=4.5.0->pymatgen->matgraphdb) (9.0.0)\n", "Requirement already satisfied: latexcodec>=1.0.4 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pybtex>=0.24.0->pymatgen->matgraphdb) (3.0.0)\n", "Requirement already satisfied: six in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pybtex>=0.24.0->pymatgen->matgraphdb) (1.17.0)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from requests->parquetdb->matgraphdb) (3.3.2)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from requests->parquetdb->matgraphdb) (1.26.20)\n", "Requirement already satisfied: ruamel.yaml.clib>=0.2.7 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ruamel.yaml>=0.17.0->pymatgen->matgraphdb) (0.2.12)\n", "Requirement already satisfied: mpmath<1.4,>=1.1.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from sympy>=1.2->pymatgen->matgraphdb) (1.3.0)\n", "Requirement already satisfied: soupsieve>1.2 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from beautifulsoup4->parquetdb->matgraphdb) (2.6)\n", "Requirement already satisfied: click>=8.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from dask->parquetdb->matgraphdb) (8.1.8)\n", "Requirement already satisfied: cloudpickle>=1.5.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from dask->parquetdb->matgraphdb) (3.1.0)\n", "Requirement already satisfied: fsspec>=2021.09.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from dask->parquetdb->matgraphdb) (2024.12.0)\n", "Requirement already satisfied: partd>=1.4.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from dask->parquetdb->matgraphdb) (1.4.2)\n", "Requirement already satisfied: toolz>=0.10.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from dask->parquetdb->matgraphdb) (1.0.0)\n", "Requirement already satisfied: locket>=1.0.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from distributed->parquetdb->matgraphdb) (1.0.0)\n", "Requirement already satisfied: msgpack>=1.0.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from distributed->parquetdb->matgraphdb) (1.1.0)\n", "Requirement already satisfied: sortedcontainers>=2.0.5 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from distributed->parquetdb->matgraphdb) (2.4.0)\n", "Requirement already satisfied: tblib>=1.6.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from distributed->parquetdb->matgraphdb) (3.0.0)\n", "Requirement already satisfied: zict>=3.0.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from distributed->parquetdb->matgraphdb) (3.0.0)\n", "Requirement already satisfied: ppft>=1.7.6.9 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pathos->parquetdb->matgraphdb) (1.7.6.9)\n", "Requirement already satisfied: pox>=0.3.5 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pathos->parquetdb->matgraphdb) (0.3.5)\n", "Requirement already satisfied: multiprocess>=0.70.17 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from pathos->parquetdb->matgraphdb) (0.70.17)\n", "Requirement already satisfied: sniffio>=1.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from anyio->httpx>=0.25.0->jupyterlab->matgraphdb) (1.3.1)\n", "Requirement already satisfied: argon2-cffi-bindings in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from argon2-cffi>=21.1->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (21.2.0)\n", "Requirement already satisfied: parso<0.9.0,>=0.8.4 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jedi>=0.16->ipython>=6.1.0->ipywidgets->matgraphdb) (0.8.4)\n", "Requirement already satisfied: attrs>=22.2.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->matgraphdb) (24.2.0)\n", "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->matgraphdb) (2024.10.1)\n", "Requirement already satisfied: referencing>=0.28.4 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->matgraphdb) (0.35.1)\n", "Requirement already satisfied: rpds-py>=0.7.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->matgraphdb) (0.22.3)\n", "Requirement already satisfied: python-json-logger>=2.0.4 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (3.2.0)\n", "Requirement already satisfied: rfc3339-validator in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (0.1.4)\n", "Requirement already satisfied: rfc3986-validator>=0.1.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (0.1.1)\n", "Requirement already satisfied: bleach!=5.0.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (6.2.0)\n", "Requirement already satisfied: defusedxml in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (0.7.1)\n", "Requirement already satisfied: jupyterlab-pygments in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (0.3.0)\n", "Requirement already satisfied: mistune<4,>=2.0.3 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (3.0.2)\n", "Requirement already satisfied: nbclient>=0.5.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (0.10.1)\n", "Requirement already satisfied: pandocfilters>=1.4.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (1.5.1)\n", "Requirement already satisfied: tinycss2 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (1.4.0)\n", "Requirement already satisfied: fastjsonschema>=2.15 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from nbformat>=5.3.0->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (2.21.1)\n", "Requirement already satisfied: wcwidth in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from prompt-toolkit<3.1.0,>=3.0.41->ipython>=6.1.0->ipywidgets->matgraphdb) (0.2.13)\n", "Requirement already satisfied: executing>=1.2.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from stack-data->ipython>=6.1.0->ipywidgets->matgraphdb) (2.1.0)\n", "Requirement already satisfied: asttokens>=2.1.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from stack-data->ipython>=6.1.0->ipywidgets->matgraphdb) (3.0.0)\n", "Requirement already satisfied: pure-eval in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from stack-data->ipython>=6.1.0->ipywidgets->matgraphdb) (0.2.3)\n", "Requirement already satisfied: webencodings in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from bleach!=5.0.0->nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (0.5.1)\n", "Requirement already satisfied: fqdn in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (1.5.1)\n", "Requirement already satisfied: isoduration in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (20.11.0)\n", "Requirement already satisfied: jsonpointer>1.13 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (3.0.0)\n", "Requirement already satisfied: uri-template in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (1.3.0)\n", "Requirement already satisfied: webcolors>=24.6.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (24.11.1)\n", "Requirement already satisfied: cffi>=1.0.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from argon2-cffi-bindings->argon2-cffi>=21.1->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (1.17.1)\n", "Requirement already satisfied: pycparser in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi>=21.1->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (2.22)\n", "Requirement already satisfied: arrow>=0.15.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from isoduration->jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (1.3.0)\n", "Requirement already satisfied: types-python-dateutil>=2.8.10 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from arrow>=0.15.0->isoduration->jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->matgraphdb) (2.9.0.20241206)\n", "Requirement already satisfied: ipykernel in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (6.29.5)\n", "Requirement already satisfied: comm>=0.1.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel) (0.2.2)\n", "Requirement already satisfied: debugpy>=1.6.5 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel) (1.8.11)\n", "Requirement already satisfied: ipython>=7.23.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel) (8.18.1)\n", "Requirement already satisfied: jupyter-client>=6.1.12 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel) (8.6.3)\n", "Requirement already satisfied: jupyter-core!=5.0.*,>=4.12 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel) (5.7.2)\n", "Requirement already satisfied: matplotlib-inline>=0.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel) (0.1.7)\n", "Requirement already satisfied: nest-asyncio in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel) (1.6.0)\n", "Requirement already satisfied: packaging in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel) (24.2)\n", "Requirement already satisfied: psutil in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel) (6.1.0)\n", "Requirement already satisfied: pyzmq>=24 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel) (26.2.0)\n", "Requirement already satisfied: tornado>=6.1 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel) (6.4.2)\n", "Requirement already satisfied: traitlets>=5.4.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipykernel) (5.14.3)\n", "Requirement already satisfied: decorator in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (5.1.1)\n", "Requirement already satisfied: jedi>=0.16 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (0.19.2)\n", "Requirement already satisfied: prompt-toolkit<3.1.0,>=3.0.41 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (3.0.48)\n", "Requirement already satisfied: pygments>=2.4.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (2.18.0)\n", "Requirement already satisfied: stack-data in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (0.6.3)\n", "Requirement already satisfied: typing-extensions in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (4.12.2)\n", "Requirement already satisfied: exceptiongroup in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (1.2.2)\n", "Requirement already satisfied: colorama in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (0.4.6)\n", "Requirement already satisfied: importlib-metadata>=4.8.3 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-client>=6.1.12->ipykernel) (8.5.0)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-client>=6.1.12->ipykernel) (2.9.0.post0)\n", "Requirement already satisfied: platformdirs>=2.5 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-core!=5.0.*,>=4.12->ipykernel) (4.3.6)\n", "Requirement already satisfied: pywin32>=300 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jupyter-core!=5.0.*,>=4.12->ipykernel) (308)\n", "Requirement already satisfied: zipp>=3.20 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from importlib-metadata>=4.8.3->jupyter-client>=6.1.12->ipykernel) (3.21.0)\n", "Requirement already satisfied: parso<0.9.0,>=0.8.4 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from jedi>=0.16->ipython>=7.23.1->ipykernel) (0.8.4)\n", "Requirement already satisfied: wcwidth in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from prompt-toolkit<3.1.0,>=3.0.41->ipython>=7.23.1->ipykernel) (0.2.13)\n", "Requirement already satisfied: six>=1.5 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from python-dateutil>=2.8.2->jupyter-client>=6.1.12->ipykernel) (1.17.0)\n", "Requirement already satisfied: executing>=1.2.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from stack-data->ipython>=7.23.1->ipykernel) (2.1.0)\n", "Requirement already satisfied: asttokens>=2.1.0 in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from stack-data->ipython>=7.23.1->ipykernel) (3.0.0)\n", "Requirement already satisfied: pure-eval in c:\\users\\lllang\\miniconda3\\envs\\matgraphdb_dev\\lib\\site-packages (from stack-data->ipython>=7.23.1->ipykernel) (0.2.3)\n" ] } ], "source": [ "!pip install parquetdb\n", "!pip install ipykernel" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 01 - Managing Graphs in ParuqetGraphDB\n", "\n", "In this notebook, we'll learn how to:\n", "\n", "1. Add new nodes and node types.\n", "2. Add new edges and edge types.\n", "3. Create node generators that automatically produce nodes based on a predefined function.\n", "4. Create edge generators that automatically produce edges based on a predefined function.\n", "\n", "We'll use the `ParquetGraphDB` class from `parquetdb` to demonstrate these features. If you haven't already installed `parquetdb`, run the previous cell." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setup\n", "\n", "Here we will setup the directory structure where are test data will come from." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from pathlib import Path\n", "import shutil\n", "import pandas as pd\n", "\n", "\n", "FILE_DIR = Path(\".\")\n", "DATA_DIR = FILE_DIR / \"data\"\n", "\n", "if DATA_DIR.exists():\n", " shutil.rmtree(DATA_DIR)\n", " \n", "DATA_DIR.mkdir(parents=True, exist_ok=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Initializing ParquetGraphDB\n", "\n", "\n", "Here we will initialize the `ParquetGraphDB` instance. We can print out a summary of the database by directly printing the instance or calling the `summary` method. The summary has additional key word arguments that can be passed used to show additional information like column_names/fields." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[INFO] 2025-04-30 08:10:23 - parquetdb.utils.config[37][load_config] - Config file: C:\\Users\\lllang\\AppData\\Local\\parquetdb\\parquetdb\\config.yml\n", "[INFO] 2025-04-30 08:10:23 - parquetdb.utils.config[41][load_config] - Setting data_dir to Z:\\data\\parquetdb\\data\n", "[INFO] 2025-04-30 08:10:24 - parquetdb.graph.parquet_graphdb[39][__init__] - Initializing GraphDB at root path: GraphDB\n", "[INFO] 2025-04-30 08:10:24 - parquetdb.graph.parquet_graphdb[174][_load_existing_node_stores] - Loading existing node stores\n", "[INFO] 2025-04-30 08:10:24 - parquetdb.graph.parquet_graphdb[203][_load_existing_stores] - Found 0 store types\n", "[INFO] 2025-04-30 08:10:24 - parquetdb.graph.parquet_graphdb[182][_load_existing_edge_stores] - Loading existing edge stores\n", "[INFO] 2025-04-30 08:10:24 - parquetdb.graph.parquet_graphdb[203][_load_existing_stores] - Found 0 store types\n", "[INFO] 2025-04-30 08:10:24 - parquetdb.core.parquetdb[200][__init__] - Initializing ParquetDB with db_path: c:\\Users\\lllang\\Desktop\\Current_Projects\\ParquetDB\\examples\\graphdb\\GraphDB\\edge_generators\n", "[INFO] 2025-04-30 08:10:24 - parquetdb.core.parquetdb[202][__init__] - verbose: 1\n", "============================================================\n", "GRAPH DATABASE SUMMARY\n", "============================================================\n", "Name: GraphDB\n", "Storage path: GraphDB\n", "└── Repository structure:\n", " ├── nodes/ (GraphDB\\nodes)\n", " ├── edges/ (GraphDB\\edges)\n", " ├── edge_generators/ (GraphDB\\edge_generators)\n", " ├── node_generators/ (GraphDB\\node_generators)\n", " └── graph/ (GraphDB\\graph)\n", "\n", "############################################################\n", "NODE DETAILS\n", "############################################################\n", "Total node types: 0\n", "------------------------------------------------------------\n", "\n", "############################################################\n", "EDGE DETAILS\n", "############################################################\n", "Total edge types: 0\n", "------------------------------------------------------------\n", "\n", "############################################################\n", "NODE GENERATOR DETAILS\n", "############################################################\n", "Total node generators: 0\n", "------------------------------------------------------------\n", "\n", "############################################################\n", "EDGE GENERATOR DETAILS\n", "############################################################\n", "Total edge generators: 0\n", "------------------------------------------------------------\n", "\n" ] } ], "source": [ "from parquetdb import ParquetGraphDB\n", "\n", "# Create a temporary directory for our database\n", "GRAPH_DB_DIR = DATA_DIR / \"GraphDB\"\n", "if GRAPH_DB_DIR.exists():\n", " shutil.rmtree(GRAPH_DB_DIR)\n", "GRAPH_DB_DIR.mkdir(parents=True, exist_ok=True)\n", "\n", "\n", "# Initialize ParquetGraphDB\n", "db = ParquetGraphDB(storage_path=GRAPH_DB_DIR)\n", "\n", "print(db)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Each ParquetGraphDB is a directory containing the following:\n", "\n", "- `nodes`: A directory containing the node data. This will be where we store in nodes in the form of NodeStores, which extend `ParquetDB` class\n", "- `edges`: A directory containing the edge data. This will be where we store in edges in the form of EdgeStores, which extend `ParquetDB` class\n", "- `node_generators`: A directory containing the node generator data. This will be where we store node generator functions that can control the creation and update of children nodes that depend on parent nodes or edges\n", "- `edge_generators`: A directory containing the edge generator data. This will be where we store edge generator functions that can control the creation and update of children edges that depend on parent nodes or edges\n", "- `generator_dependency.json`: A json file containing the dependency graph of the generators. This is used to determine the order of execution of the generators.\n", "\n", "As you can see, it is currently empty. Let's add some nodes and edges to the database.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. New Nodes\n", "\n", "By default, no custom node types. You initialize a new node type in three ways:\n", "\n", "1. You can add your own node types via `add_node_type(...)`, which creates an empty `NodeStore` for that type. \n", "2. You can add nodes directly by using the `add_nodes(node_type, data)` method and supply the `node_type` and `data`.\n", "3. You can add `NodeStore` instances directly by using the `add_node_store(node_store)` method.\n", "\n", "Once the node type is initialized, the main method to add nodes is through the `add_nodes(node_type, data)` method.\n", "\n", "\n", "Let's initialize a new node type.\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Current node_stores: ['users']\n", "============================================================\n", "GRAPH DATABASE SUMMARY\n", "============================================================\n", "Name: GraphDB\n", "Storage path: GraphDB\n", "└── Repository structure:\n", " ├── nodes/ (GraphDB\\nodes)\n", " ├── edges/ (GraphDB\\edges)\n", " ├── edge_generators/ (GraphDB\\edge_generators)\n", " ├── node_generators/ (GraphDB\\node_generators)\n", " └── graph/ (GraphDB\\graph)\n", "\n", "############################################################\n", "NODE DETAILS\n", "############################################################\n", "Total node types: 1\n", "------------------------------------------------------------\n", "• Node type: users\n", " - Number of nodes: 0\n", " - Number of features: 1\n", " - Columns:\n", " - id\n", " - db_path: GraphDB\\nodes\\users\n", "------------------------------------------------------------\n", "\n", "############################################################\n", "EDGE DETAILS\n", "############################################################\n", "Total edge types: 0\n", "------------------------------------------------------------\n", "\n", "############################################################\n", "NODE GENERATOR DETAILS\n", "############################################################\n", "Total node generators: 0\n", "------------------------------------------------------------\n", "\n", "############################################################\n", "EDGE GENERATOR DETAILS\n", "############################################################\n", "Total edge generators: 0\n", "------------------------------------------------------------\n", "\n" ] } ], "source": [ "# Add a node type called 'user'\n", "custom_node_type = \"users\"\n", "\n", "db.add_node_type(custom_node_type)\n", "\n", "# These nodes will be stored in Parquet/nodes/users\n", "print(\"Current node_stores:\", list(db.node_stores.keys()))\n", "\n", "print(db.summary(show_column_names=True))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The node store instances are stored in the `node_stores` attribute, which is a dictionary of `node_type` to `NodeStore` instances.\n", "\n", "Now, when we print the summary, we see the node type is now included. Here, we also print the column names for the node store. You can see that we have the `id` column, which is the unique local identifier for the node. Any new instances of nodes will be assigned an id automatically.\n", "\n", "Our database is currently empty, so let's add some nodes to it.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Adding Nodes\n", "\n", "As mentioned above, once a node type is registered, you can add nodes to it using the `add_nodes(node_type, data)` method. The `data` argument can take the following forms:\n", "\n", "1. list of dictionaries (Each dictionary represents a node)\n", "2. dictionary of arrays (Each key is a column name and each value is an array representing the column values for a node)\n", "3. `pandas.DataFrame` (Each row is a node)\n", "4. `pyarrow.Table` (Each row is a node)\n", "\n", "> Note: you can also automatically register a new node type by calling the `add_nodes` as well\n", "\n", "\n", "Here, we'll add data to the existing node type and add a new node type at the same time." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "============================================================\n", "GRAPH DATABASE SUMMARY\n", "============================================================\n", "Name: GraphDB\n", "Storage path: GraphDB\n", "└── Repository structure:\n", " ├── nodes/ (GraphDB\\nodes)\n", " ├── edges/ (GraphDB\\edges)\n", " ├── edge_generators/ (GraphDB\\edge_generators)\n", " ├── node_generators/ (GraphDB\\node_generators)\n", " └── graph/ (GraphDB\\graph)\n", "\n", "############################################################\n", "NODE DETAILS\n", "############################################################\n", "Total node types: 2\n", "------------------------------------------------------------\n", "• Node type: users\n", " - Number of nodes: 2\n", " - Number of features: 2\n", " - Columns:\n", " - id\n", " - name\n", " - db_path: GraphDB\\nodes\\users\n", "------------------------------------------------------------\n", "• Node type: computers\n", " - Number of nodes: 2\n", " - Number of features: 5\n", " - Columns:\n", " - id\n", " - name\n", " - specs.cpu\n", " - specs.ram\n", " - specs.storage\n", " - db_path: GraphDB\\nodes\\computers\n", "------------------------------------------------------------\n", "\n", "############################################################\n", "EDGE DETAILS\n", "############################################################\n", "Total edge types: 0\n", "------------------------------------------------------------\n", "\n", "############################################################\n", "NODE GENERATOR DETAILS\n", "############################################################\n", "Total node generators: 0\n", "------------------------------------------------------------\n", "\n", "############################################################\n", "EDGE GENERATOR DETAILS\n", "############################################################\n", "Total edge generators: 0\n", "------------------------------------------------------------\n", "\n" ] } ], "source": [ "# Add some user nodes\n", "users = [\n", " {\"name\": \"Jimmy\"},\n", " {\"name\": \"John\"},\n", "]\n", "\n", "computers = [\n", " {\n", " \"name\": \"Computer1\",\n", " \"specs\": {\"cpu\": \"AMD Ryzen 9\", \"ram\": \"32GB\", \"storage\": \"1TB\"},\n", " },\n", " {\n", " \"name\": \"Computer2\",\n", " \"specs\": {\"cpu\": \"Intel i7\", \"ram\": \"16GB\", \"storage\": \"512GB\"},\n", " },\n", "]\n", "\n", "users_node_type = \"users\"\n", "computers_node_type = \"computers\"\n", "\n", "db.add_nodes(node_type=users_node_type, data=users)\n", "db.add_nodes(node_type=computers_node_type, data=computers)\n", "\n", "print(db.summary(show_column_names=True))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Great! Now we have two node types, `users` and `computers`, and we have added some nodes to each. As you can see the summary now includes the new node types with details about each node type.\n", "\n", "Now, that we added some nodes, we need to know how to manage them.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Managing the node store\n", "\n", "Once the data is registered, you can access it through the corresponding node store. You can get the node store either through the `node_stores` attribute or the `get_node_store(node_type)` method.\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "============================================================\n", "NODE STORE SUMMARY\n", "============================================================\n", "Node type: computers\n", "• Number of nodes: 2\n", "• Number of features: 5\n", "Storage path: GraphDB\\nodes\\computers\n", "\n", "\n", "############################################################\n", "METADATA\n", "############################################################\n", "• class: NodeStore\n", "• class_module: parquetdb.graph.nodes\n", "• node_type: computers\n", "• name_column: id\n", "\n", "############################################################\n", "NODE DETAILS\n", "############################################################\n", "\n", "\n", "============================================================\n", "NODE STORE SUMMARY\n", "============================================================\n", "Node type: users\n", "• Number of nodes: 2\n", "• Number of features: 2\n", "Storage path: GraphDB\\nodes\\users\n", "\n", "\n", "############################################################\n", "METADATA\n", "############################################################\n", "• class: NodeStore\n", "• class_module: parquetdb.graph.nodes\n", "• node_type: users\n", "• name_column: id\n", "\n", "############################################################\n", "NODE DETAILS\n", "############################################################\n", "\n" ] } ], "source": [ "computers_node_store = db.get_node_store(computers_node_type)\n", "print(type(computers_node_store))\n", "print(computers_node_store)\n", "\n", "\n", "users_node_store = db.node_stores[users_node_type]\n", "print(type(users_node_store))\n", "\n", "print(users_node_store)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Reading from the node store\n", "\n", "There are multiple ways to read from the node store. You can use the `read_nodes` method from the `MatGraphDB` instance, you can use the `read_nodes` method from the `NodeStore` instance, or you can use the `read` method from the `NodeStore` instance. These reads methods behave very similarly as the read features introduced in the previous notebook, such as you can read columns using filters or columns" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " id name\n", "0 0 Jimmy\n", "1 1 John\n", "----------------------------------------------------------------------------------------------------\n", " id name specs.cpu specs.ram specs.storage\n", "0 0 Computer1 AMD Ryzen 9 32GB 1TB\n", "1 1 Computer2 Intel i7 16GB 512GB\n", "----------------------------------------------------------------------------------------------------\n", " id name specs.cpu specs.ram specs.storage\n", "0 1 Computer2 Intel i7 16GB 512GB\n", "----------------------------------------------------------------------------------------------------\n", " name id specs\n", "0 Computer1 0 {'cpu': 'AMD Ryzen 9', 'ram': '32GB', 'storage...\n" ] } ], "source": [ "import pyarrow.compute as pc\n", "\n", "df = db.read_nodes(node_type=users_node_type).to_pandas()\n", "print(df)\n", "\n", "print(\"-\"*100)\n", "\n", "df = computers_node_store.read().to_pandas()\n", "\n", "print(df)\n", "\n", "print(\"-\"*100)\n", "\n", "# We can filter this similar to ParquetDB\n", "df = computers_node_store.read(\n", " filters=[pc.field(\"specs.cpu\") == \"Intel i7\"]\n", ").to_pandas()\n", "\n", "print(df)\n", "print(\"-\"*100)\n", "\n", "\n", "# Notice if you rebuild the nested struct, the way you access the nested data is different\n", "df = computers_node_store.read_nodes(\n", " columns=[\"name\", \"id\", \"specs\"],\n", " filters=[pc.field(\"specs\", \"cpu\") == \"AMD Ryzen 9\"],\n", " rebuild_nested_struct=True,\n", ").to_pandas()\n", "print(df)\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Updating the node store\n", "\n", "You can update the node store by using the `update_nodes` method from the `ParquetGraphDB` instance, or the `update_nodes` method from the `NodeStore` instance." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " id name specs.cpu specs.ram specs.storage\n", "0 0 Computer1 AMD Ryzen 9 128GB 1TB\n", "1 1 Computer2 Intel i7 256GB 2TB\n" ] } ], "source": [ "computer_update_data = [\n", " {\"name\": \"Computer1\", \"specs\": {\"ram\": \"128GB\", \"storage\": \"1TB\"}},\n", " {\"name\": \"Computer2\", \"specs\": {\"ram\": \"256GB\", \"storage\": \"2TB\"}},\n", "]\n", "\n", "db.update_nodes(\n", " node_type=computers_node_type, data=computer_update_data, update_keys=[\"name\"]\n", ")\n", "\n", "df = db.read_nodes(node_type=computers_node_type).to_pandas()\n", "print(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Adding New Edges\n", "\n", "Edges are managed in the same way as nodes, but they are stored in the `EdgeStore` instance. EdgeStores differ from NodeStores as they have to store the source and target node ids, as well as the edge type. These must be specified to add an edge.\n", "\n", "You can create a new edge type using `add_edge_type(edge_type)`. Then, you can add edges by calling `add_edges(edge_type, data)`.\n", "- `source_id` and `source_type`\n", "- `target_id` and `target_type`\n", "\n", "\n", "The `ids` and `types` must match the node types and ids nodes in `MatGraphDB`." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of edges of type 'test_edge': 6\n", " edge_type extra_detail id \\\n", "0 user_access None 0 \n", "1 user_access None 1 \n", "2 user_access None 2 \n", "3 user_access None 3 \n", "4 user_access None 4 \n", "5 user_access This is the main computer 5 \n", "\n", " name source_id source_type target_id \\\n", "0 Jimmy has access to Computer1 0 users 0 \n", "1 Jimmy has access to Computer2 0 users 1 \n", "2 John has access to Computer2 1 users 1 \n", "3 Computer1 has access to Computer2 0 computers 1 \n", "4 Computer2 has access to Computer1 1 computers 0 \n", "5 Computer1 has access to Computer1 0 computers 0 \n", "\n", " target_type \n", "0 computers \n", "1 computers \n", "2 computers \n", "3 computers \n", "4 computers \n", "5 computers \n" ] } ], "source": [ "# Add edge type\n", "edge_type_test = \"user_access\"\n", "\n", "# We'll connect the 'user' nodes to the 'item' nodes\n", "edge_data = [\n", " {\n", " \"source_id\": 0, # This is the id of the user node\n", " \"source_type\": users_node_type,\n", " \"target_id\": 0, # This is the id of the computer node\n", " \"target_type\": computers_node_type,\n", " \"edge_type\": edge_type_test,\n", " \"name\": \"Jimmy has access to Computer1\",\n", " },\n", " {\n", " \"source_id\": 0, # This is the id of the user node\n", " \"source_type\": users_node_type,\n", " \"target_id\": 1, # This is the id of the computer node\n", " \"target_type\": computers_node_type,\n", " \"edge_type\": edge_type_test,\n", " \"name\": \"Jimmy has access to Computer2\",\n", " },\n", " {\n", " \"source_id\": 1,\n", " \"source_type\": users_node_type,\n", " \"target_id\": 1,\n", " \"target_type\": computers_node_type,\n", " \"edge_type\": edge_type_test,\n", " \"name\": \"John has access to Computer2\",\n", " },\n", " {\n", " \"source_id\": 0,\n", " \"source_type\": computers_node_type,\n", " \"target_id\": 1,\n", " \"target_type\": computers_node_type,\n", " \"edge_type\": edge_type_test,\n", " \"name\": \"Computer1 has access to Computer2\",\n", " },\n", " {\n", " \"source_id\": 1,\n", " \"source_type\": computers_node_type,\n", " \"target_id\": 0,\n", " \"target_type\": computers_node_type,\n", " \"edge_type\": edge_type_test,\n", " \"name\": \"Computer2 has access to Computer1\",\n", " },\n", " {\n", " \"source_id\": 0,\n", " \"source_type\": computers_node_type,\n", " \"target_id\": 0,\n", " \"target_type\": computers_node_type,\n", " \"edge_type\": edge_type_test,\n", " \"name\": \"Computer1 has access to Computer1\",\n", " \"extra_detail\": \"This is the main computer\",\n", " },\n", "]\n", "\n", "db.add_edges(edge_type=edge_type_test, data=edge_data)\n", "\n", "edges = db.read_edges(edge_type=edge_type_test)\n", "print(\"Number of edges of type 'test_edge':\", len(edges))\n", "df_edges = edges.to_pandas()\n", "print(df_edges)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example we have defined the computer access edges between users and computers. Note that we can specify self-edges and directionality of the edges by choosing which node is the source and which is the target.\n", "\n", "Also we are free to add additional columns/features to the edges, such as `extra_detail` in this case." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Updating the edges\n", "\n", "You can update the edges by using the `update_edges` method from the `MatGraphDB` instance, or the `update_edges` method from the `EdgeStore` instance.\n" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of edges of type 'test_edge': 6\n", " id source_id target_id weight name\n", "0 0 0 0 1.0 Jimmy has access to Computer1\n", "1 1 0 1 1.0 Jimmy has access to Computer2\n", "2 2 1 1 NaN John has access to Computer2\n", "3 3 0 1 NaN Computer1 has access to Computer2\n", "4 4 1 0 NaN Computer2 has access to Computer1\n", "5 5 0 0 NaN Computer1 has access to Computer1\n" ] } ], "source": [ "update_data = [\n", " {\"id\": 0, \"weight\": 1.0},\n", " {\"id\": 1, \"weight\": 1.0},\n", "]\n", "\n", "db.update_edges(edge_type=edge_type_test, data=update_data)\n", "\n", "edges = db.read_edges(\n", " edge_type=edge_type_test, columns=[\"id\", \"source_id\", \"target_id\", \"weight\", \"name\"]\n", ").to_pandas()\n", "print(\"Number of edges of type 'test_edge':\", len(edges))\n", "print(edges)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also update by specifying the source and target ids and types. To do this we need to specify `source_id`, `target_id`, `source_type`, and `target_type` in the `update_keys` argument.\n" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of edges of type 'test_edge': 6\n", " id source_id target_id weight name\n", "0 0 0 0 0.5 Jimmy has access to Computer1\n", "1 1 0 1 1.0 Jimmy has access to Computer2\n", "2 2 1 1 NaN John has access to Computer2\n", "3 3 0 1 NaN Computer1 has access to Computer2\n", "4 4 1 0 NaN Computer2 has access to Computer1\n", "5 5 0 0 NaN Computer1 has access to Computer1\n" ] } ], "source": [ "update_data = [\n", " {\n", " \"source_id\": 0,\n", " \"source_type\": users_node_type,\n", " \"target_id\": 0,\n", " \"target_type\": computers_node_type,\n", " \"weight\": 0.5,\n", " },\n", "]\n", "\n", "db.update_edges(\n", " edge_type=edge_type_test,\n", " data=update_data,\n", " update_keys=[\"source_id\", \"target_id\", \"source_type\", \"target_type\"],\n", ")\n", "\n", "\n", "edges = db.read_edges(\n", " edge_type=edge_type_test, columns=[\"id\", \"source_id\", \"target_id\", \"weight\", \"name\"]\n", ").to_pandas()\n", "print(\"Number of edges of type 'test_edge':\", len(edges))\n", "print(edges)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "============================================================\n", "GRAPH DATABASE SUMMARY\n", "============================================================\n", "Name: GraphDB\n", "Storage path: GraphDB\n", "└── Repository structure:\n", " ├── nodes/ (GraphDB\\nodes)\n", " ├── edges/ (GraphDB\\edges)\n", " ├── edge_generators/ (GraphDB\\edge_generators)\n", " ├── node_generators/ (GraphDB\\node_generators)\n", " └── graph/ (GraphDB\\graph)\n", "\n", "############################################################\n", "NODE DETAILS\n", "############################################################\n", "Total node types: 2\n", "------------------------------------------------------------\n", "• Node type: users\n", " - Number of nodes: 2\n", " - Number of features: 2\n", " - db_path: GraphDB\\nodes\\users\n", "------------------------------------------------------------\n", "• Node type: computers\n", " - Number of nodes: 2\n", " - Number of features: 5\n", " - db_path: GraphDB\\nodes\\computers\n", "------------------------------------------------------------\n", "\n", "############################################################\n", "EDGE DETAILS\n", "############################################################\n", "Total edge types: 1\n", "------------------------------------------------------------\n", "• Edge type: user_access\n", " - Number of edges: 6\n", " - Number of features: 9\n", " - db_path: GraphDB\\edges\\user_access\n", "------------------------------------------------------------\n", "\n", "############################################################\n", "NODE GENERATOR DETAILS\n", "############################################################\n", "Total node generators: 0\n", "------------------------------------------------------------\n", "\n", "############################################################\n", "EDGE GENERATOR DETAILS\n", "############################################################\n", "Total edge generators: 0\n", "------------------------------------------------------------\n", "\n" ] } ], "source": [ "print(db)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion\n", "\n", "In this notebook, we explored the process of managing graphs using ParquetGraphDB. Specifically, we:\n", "\n", "- Added new node types and registered nodes within those types.\n", "- Learned how to create and manage edge types, including adding and updating edges.\n", "- Explored the functionality of reading and updating data from both node and edge stores.\n", "\n", "These capabilities form the foundation for representing and manipulating complex graph-based data efficiently. \n", "\n", "### What's Next?\n", "\n", "In the next notebook, we will go into adding node and edge generators. Generators allow the creation of nodes and edges dynamically based on predefined functions. This allows ParquetGraphDB to propagate updates to dependent nodes and edges if there are any changes to the parent nodes or edges.\n" ] } ], "metadata": { "kernelspec": { "display_name": "parquetdb", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.17" }, "name": "Example 2 - Managing Graphs in MatGraphDB", "nbsphinx": { "execute": "never" } }, "nbformat": 4, "nbformat_minor": 4 }